package com.atguigu.day17.set04;

import org.junit.Test;

import java.util.HashSet;

/*
Collection: 集合的顶级接口
    -- List 有序 不唯一
       -- ArrayList
       -- LinkedList
    -- Set 对比Collection没有新增方法
          唯一(数据不能重复)

Collection集合的遍历:
      1.迭代器遍历
      2.增强for遍历(底层是迭代器)
           for(集合元素类型 变量名:集合名){
               变量名:集合内的一个个元素
           }
    注意:
      1. 为什么集合对象可以使用迭代器遍历(增强for)
            因为集合对象是  Iterable接口的孩子
      2. 遍历时通过集合对象增删元素 [可能]发生 并发修改异常
          modCount: 记录对集合修改的次数 增加/删除 都会导致 modCount++
      3.使用迭代器对象删除元素 不会发生并发修改异常

List: 特点 有序
          不唯一
      遍历:  4种
      实现类:
           数组  ArrayList vs  Vector:
                同: 1.底层都是数组 Object[]
                    2.有共同的父亲 AbstractList
                不同:
                   1.创建对象时底层数组长度不同
                      ArrayList 底层数组长度为0 第一次添加数据时 长度为10
                      Vector 底层数组长度为10
                   2.扩容规则不同:
                       ArrayList: 原来的1.5倍
                       Vector:  capacityIncrement=0    原来的2倍
                                capacityIncrement>0    旧的长度+capacityIncrement
                   3.线程安全问题
                         ArrayList: 线程不安全 效率高
                         Vector:   线程安全  效率低
           双向链表: LinkedList:
                      新增了操作头尾的方法
                      模拟栈和队列操作:
                             栈: FILO first in last out
                                 刷盘子 压子弹
                             队列: FIFO first in first out
                                 超市结账
Set: 唯一(数据不重复)
   HashSet:
          底层数据结构: 哈希表
          特点:
               无序:(非添加顺序)
               唯一:
          注意:
              1.如果是自定义类型数据  必须重写 hashCode() equals()

 */
public class HashSetTest {
    @Test
    public void test04(){
        Dog d1 = new Dog("大黄", 5);
        Dog d2 = new Dog("旺财", 5);
        Dog d3 = new Dog("旺财", 6);
        Dog d4 = new Dog("大黄", 9);
        Dog d5 = new Dog("大黄", 9);

        HashSet<Dog> set = new HashSet<>();
        set.add(d1);
        set.add(d2);
        set.add(d3);
        set.add(d4);
        set.add(d5);

        int size = set.size();
        System.out.println(size);

        for (Dog dog : set) {
            System.out.println("dog = " + dog);
        }
    }

    @Test
    public void test03(){
        Student s1 = new Student("张三",20);
        Student s2 = new Student("李四",30);
        Student s3 = new Student("李四",30);
        Student s4 = new Student("张三",20);

        HashSet<Student> set = new HashSet<>();
        set.add(s1);
        set.add(s2);
        set.add(s3);
        set.add(s4);

        System.out.println("set.size() = " + set.size());

        for (Student student : set) {
            System.out.println("student = " + student);
        }
    }



    @Test
    public void test02() {
        HashSet<Integer> hashSet = new HashSet<>();

        hashSet.add(66);
        hashSet.add(33);
        hashSet.add(9);
        hashSet.add(18);
        hashSet.add(9);
        System.out.println("hashSet.size() = " + hashSet.size());

        for (Integer i : hashSet) {
            System.out.println("i = " + i);
        }
    }


    @Test
    public void test01() {

        HashSet<String> set = new HashSet<>();
        set.add("张三");
        set.add("李四");
        set.add("王五");
        set.add("赵六");
        set.add("赵六");

        System.out.println("set.size() = " + set.size());

        for (String s : set) {
            System.out.println("s = " + s);
        }
    }
}
